#ifndef TIPOSBONUS_H_
#define TIPOSBONUS_H_

#include <iostream>
#include "string.h"
#include "TipoBonus.h"
#include "Lista.h"
#include "PuntosDeGrillaConMismaTexturaException.h"
#include "TipoYaExisteException.h"
using namespace std;

class TiposBonus : public Lista<TipoBonus*> , public ObjetoModelo {

public:

	TiposBonus(){
		this->setNombreClase("TiposBonus");
	}

	/*
	Si el Tipo de Bonus de nombre n esta dentro de la lista devuelve true,
	en caso contrario devuelve false
	*/

	bool yaEstaTipo(string n){
		IteradorLista<TipoBonus*> iterador = this->iterador();
		bool esta = false;
		while ((iterador.tieneSiguiente())  &&  (!esta)){
			TipoBonus* unTipoBonus = iterador.siguiente();
			esta = (unTipoBonus->getNombre()==n);
		}
		return esta;
	}


	
	bool yaEstaTextura(string t){
		IteradorLista<TipoBonus*> iterador = this->iterador();
		bool esta = false;
		while ((iterador.tieneSiguiente())  &&  (!esta)){
			TipoBonus* unTipoBonus = iterador.siguiente();
			esta = (unTipoBonus->getTextura()==t);
		}
		return esta;
	}

		void agregarObjeto(ObjetoModelo* om) throw(...) {
		if(om!=NULL){
			if(om->getNombreClase()=="TipoBonus"){
				if(yaEstaTextura(((TipoBonus*)om)->getTextura())){
					throw new PuntosDeGrillaConMismaTexturaException();
				}
				if(yaEstaTipo(((TipoBonus*)om)->getNombre())){
					throw new TipoYaExisteException();
				}
				this->agregar((TipoBonus*)om);
			}
			else {
				throw new AtributoDesconocidoException(om->getNombreClase());
			}
		}
	}
};
#endif